package com.zjl.SpringBoot.第14章_AOT;

/**
 *
 * Java 7开始引入了分层编译(Tiered Compiler)的概念,它结合了C1和C2的优势,
 * 追求启动速度和峰值性能的一个平衡。
 * 分层编译将JVM的执行状态分为了五个层次。五个层级分别是:
 *      ● 解释执行。
 *      ● 执行不带profiling的C1代码。
 *      ● 执行仅带方法调用次数以及循环回边执行次数profiling的C1代码。
 *      ● 执行带所有profiling的C1代码。
 *      ● 执行C2代码。
 * profiling就是收集能够反映程序执行状态的数据。中最基本的统计数据就是方法的调用次数,以及循环回边的执行次数。
 *
 *      ●图中第①条路径,代表编译的一般情况，热点方法从解释执行到被3层的C1编译， 最后被4层的C2编译。
 *      ●如果方法比较小(此如Java服务中常见的getter/setter方法) ，3层的profiling没有收集到有价值的数据,
 *       JVM就会断定该方法对于C1代码和C2代码的执行效率相同，就会执行图中第②条路径。
 *       在这种情况下，JVM会在3层编译之后,放弃进入C2编译,直接选择用1层的C1编译运行
 *      ●在C1忙碌的情况下，执行图中第③条路径,在解释执行过程中对程序进行profiling，
 *       根据信息直接由第4层的C2编译。
 *      ●前文提到C1中的执行效率是1层>2层>3层,第3层一般要比第2层慢35%以上,所以在C2忙碌的情况下，
 *       执行图中第④条路径。这时方法会被2层的C1编译,然后再被3层的C1编译,以减少方法在3层的执行时间。
 *      ●如果编译器做了一些比较激进的优化，比如分支预测，在实际运行时发现预测出错,这时就会进行反优化，
 *      重新进入解释执行，图中第⑤条执行路径代表的就是反优化。
 *
 * 总的来说，C1的编译速度更快, C2的编译质量更高，分层编译的不同编译路径,也就是JVM根据当前服务的运行
 * 情况来寻找当前服务的最佳平衡点的一个过程。从JDK 8开始，JVM默认开启分层编译。
 *
 */
public class D_分层编译 {

}
